package aqs;

import java.util.concurrent.locks.AbstractQueuedSynchronizer;

public class MyAQSLock {
    static class AqsLock extends AbstractQueuedSynchronizer {
        @Override
        protected boolean tryAcquire(int arg) {
            assert arg == 1;//只能设置一个量
            if(compareAndSetState(0,1)) { //如果state为0，才设置为1，也说明是不可重入的
                setExclusiveOwnerThread(Thread.currentThread()); //将当前线程设置为独占资源（锁）
                return true;
            }
            return false;
        }

        @Override
        protected boolean tryRelease(int arg) {
            assert  arg == 1;//只能设置一个量 => 不可重入
            setExclusiveOwnerThread(null);
            setState(0);
            return true;
        }

        @Override
        protected boolean isHeldExclusively() {
            return getState() == 1;
        }
    }

    AqsLock aqsLock = new AqsLock();
    public void lock() {
        aqsLock.tryAcquire(1);
    }
    public void unlock() {
        aqsLock.tryRelease(1);
    }
    public boolean isLocked() {
        return aqsLock.isHeldExclusively();
    }
}
